package com.util.log;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日志打印对象
 */
public class Logger {

    private String classNameBound; // eg: o.s.b.a.w.s.WelcomePageHandlerMapping 类名太长就缩短长度

    private static final int CONST_class_name_max_length = 40; // 限制类名最大长度

    /**
     * 日志格式： "2020年12月26日 21时08分39秒 --- o.s.b.a.w.s.WelcomePageHandlerMapping    : 日志内容";
     */
    private static final String CONST_logFormat = "%s [%5s] --- %-" + CONST_class_name_max_length + "s : %s\n";

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");

    private Logger() {
    }

    public static Logger getLogger(Class<?> clazz) {
        Logger log = new Logger();
        String typeName = clazz.getTypeName();
        if (typeName.length() > CONST_class_name_max_length)  // 类名太长就缩短长度
            typeName = "..." + typeName.substring(typeName.length() - CONST_class_name_max_length + 3);
        log.classNameBound = typeName;
        return log;
    }

    /**
     * 打印日志
     *
     * @param content
     * @param level   日志级别 trace | info | error
     */
    private void log(String content, String level) {
        if (level.length() > 5)
            level = level.substring(0, 4);
        String[] strs = content.split("\\n");
        for (String str : strs)
            System.out.printf(CONST_logFormat,  dateFormat.format(new Date()), level, classNameBound, str);
    }

    /**
     * 打印日志
     */
    public void trace(String str) {
        log(str, "trace");
    }

    /**
     * 打印日志
     */
    public void info(String str) {
        log(str, "info");
    }

    /**
     * 打印日志
     */
    public void error(String str) {
        log(str, "error");
    }

    public static void main(String[] args) {
        //日志格式： "2020年12月26日 21时08分39秒 --- o.s.b.a.w.s.WelcomePageHandlerMapping    : 日志内容";
        Logger log = Logger.getLogger(Logger.class);
        log.trace("日志打印测试");
        log.info("日志打印测试");
        log.error("日志打印测试");
        log.info("jisji\njifsjd\n\njidsfs");
    }
}
